/**
 * @file cfactory.c
 * @brief Sorgente per la gestione dell'invocazione dei comandi.
 *
 * Prima di gestire una richiesta bisogna gestire l'interfacciamento e l'inizializzazione del sistema
 * di gestione dei comandi. Vengono implementate in questo file le funzioni pubbliche che permettono
 * di configurare correttamente l'inizializzazione dell'invoker e che permettano una corretta interpretazione
 * delle richieste dell'utente.
 * In quest'ultimo caso si devono gestire tramite il pattern chain of responsability le impostazioni per
 * l'interpretazione multipla dei comandi (es: comando exit intepretato anche con 'quit' o con 'q' ecc..).
 *
 *  @date Feb 27, 2012
 *  @author Corvino Francesco
 */
#include "cfactory.h"
#include "../logproxy/logproxy.h"

static int _cFactory_status = 0;


void _cFactory_initialize(){
	DescApplication applicationData;

	// set values for commands
	applicationData.commands.cmpElem =
			SingApp_CMDSelector;
	applicationData.commands.numelement = 0;
	applicationData.commands
		.sizeSingleElem = sizeof(DescCommand);
	applicationData.commands.elemBuff = NULL;

	// set values for requests
	applicationData.requests.cmpElem = NULL; // ordinamento per ordine temporale
	applicationData.requests.numelement = 0;
	applicationData.requests
		.sizeSingleElem = sizeof(DescRequest);
	applicationData.requests.elemBuff = NULL;

	// assign values to Factory object for Application resource
	FactApp_initManagedRsc(&applicationData);

	// initialize values for invoker object
	Invoker ivk;
	ivk.addReq = FactApp_addRequest;
	ivk.getCMD = FactApp_getCommand;
	ivk.log = NULL;
	Invoke_setInvoker(&ivk);

	_cFactory_status++;
}

void CFactory_SetConfigurationBase(){
	Logging_setLoggingOut(logsimplefunction);
	// avvia l'invoker
	if(_cFactory_status == 0 ) _cFactory_initialize();
	// inserire tutte le librerie di base da caricare
	if(_cFactory_status == 1) {
		cutility_LoadAllCommands(); // libreria utilità
		testsdlib_LoadAllCommands(); // libreria testing
		_cFactory_status++;
	}
}

typedef struct cfactoryChainFilter {

	struct cfactoryChainFilter * next;
} CFactoryChainFilter;

void CFactory_AddChainFilter(CFactoryChainFilter * filter){
	//TODOL chain per l'inizializzazione il filtering dei comandi inviati dall'utente
}

DescRequest* CFactory_GetFilteredReq(char * buf){
	DescRequest *req = malloc(sizeof(DescRequest));
	if(req!=NULL){
		// individua il testo del comando
		getFirstWord(buf,req->nameCmd, " \n");
		// TODOL richiama la chain of filter
	}
	return req;
}
